G_LOCK_DEFINE_STATIC (init_lock);
G_LOCK_DEFINE_STATIC (threadunsafe_loader_lock);
-void
+gboolean
_gdk_pixbuf_lock (GdkPixbufModule *image_module)
{
- if (!(image_module->info->flags & GDK_PIXBUF_FORMAT_THREADSAFE)) {
+ if (g_threads_got_initialized &&
+ !(image_module->info->flags & GDK_PIXBUF_FORMAT_THREADSAFE)) {
G_LOCK (threadunsafe_loader_lock);
+
+ return TRUE;
}
+
+ return FALSE;
}
void
GError **error)
{
gboolean ret;
+ gboolean locked = FALSE;
- G_LOCK (init_lock);
+ /* be extra careful, maybe the module initializes
+ * the thread system
+ */
+ if (g_threads_got_initialized)
+ {
+ G_LOCK (init_lock);
+ locked = TRUE;
+ }
ret = _gdk_pixbuf_load_module_unlocked (image_module, error);
- G_UNLOCK (init_lock);
+ if (locked)
+ G_UNLOCK (init_lock);
return ret;
}
GdkPixbuf *pixbuf = NULL;
GdkPixbufAnimation *animation = NULL;
gpointer context;
+ gboolean locked;
- _gdk_pixbuf_lock (module);
+ locked = _gdk_pixbuf_lock (module);
if (module->load != NULL) {
pixbuf = (* module->load) (f, error);
pixbuf = gdk_pixbuf_animation_get_static_image (animation);
g_object_ref (pixbuf);
-
g_object_unref (animation);
}
}
out:
- _gdk_pixbuf_unlock (module);
+ if (locked)
+ _gdk_pixbuf_unlock (module);
return pixbuf;
}
GdkPixbuf *(* load_xpm_data) (const char **data);
GdkPixbuf *pixbuf;
GError *error = NULL;
- GdkPixbufModule *xpm_module = _gdk_pixbuf_get_named_module ("xpm", &error);
+ GdkPixbufModule *xpm_module;
+ gboolean locked;
+
+ xpm_module = _gdk_pixbuf_get_named_module ("xpm", &error);
if (xpm_module == NULL) {
g_warning ("Error loading XPM image loader: %s", error->message);
g_error_free (error);
}
}
- _gdk_pixbuf_lock (xpm_module);
+ locked = _gdk_pixbuf_lock (xpm_module);
if (xpm_module->load_xpm_data == NULL) {
g_warning ("gdk-pixbuf XPM module lacks XPM data capability");
load_xpm_data = xpm_module->load_xpm_data;
pixbuf = (* load_xpm_data) (data);
}
-
- _gdk_pixbuf_unlock (xpm_module);
+
+ if (locked)
+ _gdk_pixbuf_unlock (xpm_module);
return pixbuf;
}
{
gboolean ret;
GdkPixbufModule *image_module = NULL;
+ gboolean locked;
image_module = _gdk_pixbuf_get_named_module (type, error);
if (!_gdk_pixbuf_load_module (image_module, error))
return FALSE;
- _gdk_pixbuf_lock (image_module);
+ locked = _gdk_pixbuf_lock (image_module);
if (image_module->save) {
/* save normally */
ret = FALSE;
}
- _gdk_pixbuf_unlock (image_module);
+ if (locked)
+ _gdk_pixbuf_unlock (image_module);
return ret;
}
gchar *buf = NULL;
gsize n;
gchar *filename = NULL;
+ gboolean locked;
buf = g_try_malloc (TMP_FILE_BUF_SIZE);
if (buf == NULL) {
goto end;
}
- _gdk_pixbuf_lock (image_module);
+ locked = _gdk_pixbuf_lock (image_module);
retval = (image_module->save) (f, pixbuf, keys, values, error);
- _gdk_pixbuf_unlock (image_module);
+ if (locked)
+ _gdk_pixbuf_unlock (image_module);
if (!retval)
goto end;
{
gboolean ret;
GdkPixbufModule *image_module = NULL;
+ gboolean locked;
image_module = _gdk_pixbuf_get_named_module (type, error);
if (!_gdk_pixbuf_load_module (image_module, error))
return FALSE;
- _gdk_pixbuf_lock (image_module);
+ locked = _gdk_pixbuf_lock (image_module);
if (image_module->save_to_callback) {
/* save normally */
ret = FALSE;
}
- _gdk_pixbuf_unlock (image_module);
+ if (locked)
+ _gdk_pixbuf_unlock (image_module);
return ret;
}